package com.neusoft.sort.select;

/**
 * @author lichunlong lcl253137@alibaba-inc.com
 * @desc 选择排序
 * @date 2024-11-07
 */
public class SelectSort {

    /**
     * 选择排序: 时间复杂度 O(n^2)
     *
     * @param arr 待排序数组
     */
    public static void selectSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = compareAndSetMinIndex(arr, j, minIndex);
            }
            compareAndSwap(arr, i, minIndex);
        }
    }

    /**
     * 比较并设置最小数的index
     *
     * @param arr          待排序数组
     * @param currentIndex 当前数索引
     * @param minIndex     最小数索引
     * @return 最小数索引
     */
    public static int compareAndSetMinIndex(int[] arr, int currentIndex, int minIndex) {
        if (arr[currentIndex] < arr[minIndex]) {
            minIndex = currentIndex;
        }

        return minIndex;
    }

    /**
     * 比较并交换最小值
     *
     * @param arr          待排序数组
     * @param currentIndex 当前数索引
     * @param minIndex     最小数索引
     */
    public static void compareAndSwap(int[] arr, int currentIndex, int minIndex) {
        if (arr[currentIndex] > arr[minIndex]) {
            int temp = arr[currentIndex];
            arr[currentIndex] = arr[minIndex];
            arr[minIndex] = temp;
        }
    }

}
